package com.qfedu.buy.server.service.impl;

import com.qfedu.buy.common.config.RabbitMQConstantConfig;
import com.qfedu.buy.common.config.RedisKeyConfig;
import com.qfedu.buy.common.dto.CartAddDto;
import com.qfedu.buy.common.dto.CartNumDto;
import com.qfedu.buy.common.util.RedissonUtil;
import com.qfedu.buy.common.vo.R;
import com.qfedu.buy.server.dao.CartItemDao;
import com.qfedu.buy.server.entity.CartItem;
import com.qfedu.buy.server.service.intf.CartItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: NeighborBuy
 * @description:
 * @author: Feri(邢朋辉)
 * @create: 2021-02-02 09:38
 */
@Service
public class CartItemServiceImpl implements CartItemService {
    @Autowired
    private CartItemDao dao;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public R addCart(CartAddDto dto, int uid) {
        //加入购物车
        if(dto!=null && uid>0){
            //商品之前就在购物车中
            CartItem cartItem=dao.select(uid,dto.getGskuid());
            if(cartItem==null){
                //商品之前没有添加过
                //新增商品到购物车
                cartItem=new CartItem(uid,dto.getGid(),dto.getGskuid(),dto.getNum(),dto.getJoinprice());
                dao.insert(cartItem);
            }else{
                //增加数量
                dao.update(cartItem.getId(),dto.getNum());
            }
            return R.ok();
        }
        return R.fail();
    }

    @Override
    public R queryByUid(int uid) {
        //可以考虑 缓存
        return R.ok(dao.selectdetail(uid));
    }

    @Override
    public R changeNumV1(CartNumDto dto) {
        if(dto!=null && dto.getId()>0){
//            CartItem item=dao.selectById(dto.getId());
//            if(item!=null){
//                if(item.getNum()+dto.getNum()<=0){
//                    //数量减少  0
//                    //删除商品 --
//                }
//            }
            if(dao.update(dto.getId(),dto.getNum())>0){
                return R.ok();
            }
        }
        return R.fail();
    }

    //数量变化的接口升级 ---缓存---Redis
    @Override
    public R changeNumV2(CartNumDto dto,int uid) {
        //优化 购物车商品数量变化
        //Redis ---数据类型---存储购物车数据
        if(dto!=null && dto.getId()>0){
            boolean r=false;
            //检查Redis
            if(RedissonUtil.isHave(RedisKeyConfig.CART_NUM+uid)){
                //操作Redis
                //存在对应的购物车详情
                if(RedissonUtil.checkField(RedisKeyConfig.CART_NUM+uid, dto.getId()+"")){
                    //修改数据
                    int n=Integer.parseInt(RedissonUtil.getHash(RedisKeyConfig.CART_NUM+uid, dto.getId()+""));
                    if(n+dto.getNum()<=0){
                        //删除
                        return R.fail("亲，你是想要删除商品吗");
                    }else {
                        //修改Redis中的数量
                        RedissonUtil.setHash(RedisKeyConfig.CART_NUM + uid,
                                dto.getId() + "", (n+dto.getNum())+"");
                        //基于RabbitMQ 实现数据同步  异步处理
                        rabbitTemplate.convertAndSend("", RabbitMQConstantConfig.QUEUE_CART_NUM,dto);
                    }
                }else{
                    r=true;
                }
            }else{
                r=true;
            }
            if(r){
                //操作Mysql
                if(dao.update(dto.getId(),dto.getNum())>0){
                    //成功之后  同步Redis
                    CartItem item=dao.selectById(dto.getId());
                    RedissonUtil.setHash(RedisKeyConfig.CART_NUM+uid,
                            dto.getId()+"",item.getNum()+"");
                    RedissonUtil.expire(RedisKeyConfig.CART_NUM+uid,RedisKeyConfig.CART_NUM_TIME);
                    return R.ok();
                }
            }
        }
        return R.fail();
    }

    @Override
    public R del(int id) {
        if(id>0){
            if(dao.delById(id)>0){
                return R.ok();
            }
        }
        return R.fail();
    }
    @Override
    public R createOrderPre() {
        return null;
    }
}
